﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Delegate
{
    // 泛型、委托、事件、多线程
    //委托： 方法
    //类A (a) ---> 类B (b, c)
    //问题： c是无法直接访问A中的a方法！使用委托可以完成这个任务。委托是对a这个方法的访问起"桥梁"作用的
    //委托：其实就是相当于把一个方法当成变量来使用
    //委托五步法！
    class Program
    {
        static void Main(string[] args)
        {
            // MyStudy1();
            //StudyDelegate myStudy1 = new StudyDelegate(MyStudy3);
            //StudyDelegate myStudy2 = MyStudy2;

            //【3】创建委托变量
            StudyDelegate myStudy = null;

            //【4】关联委托方法
            myStudy = MyStudy1;

            //多路委托(多播)
            myStudy += MyStudy2;
            myStudy += MyStudy3;

            //【5】使用委托变量
            myStudy();
            Console.WriteLine("------------------------------");

            //动态删除关联
            myStudy -= MyStudy3;
            myStudy();

            Console.ReadLine();
        }

        //【2】方法编写
        static void MyStudy1()
        {
            Console.WriteLine("我正在学习c#上位机开发-委托");
        }
        static void MyStudy2()
        {
            Console.WriteLine("你正在学习c#上位机开发-委托");
        }
        static void MyStudy3()
        {
            Console.WriteLine("他正在学习c#上位机开发-委托");
        }
    }

    //【1】声明委托(声明一个方法的原型:方法返回值原型、参数原型和个数)
    public delegate void StudyDelegate();
}
